package Sesiones;

import Librerias.Filapedido;
import Librerias.Pedido;
import Librerias.Producto;
import Librerias.Usuario;
import ManagedBeans.ManagedBeanProductos;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.ejb.LocalBean;
import javax.ejb.PostActivate;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

@Stateful
@LocalBean
public class SesionCarrito implements Serializable{
    private ArrayList<Producto> listaProductos = new ArrayList<Producto>();
    private ArrayList listaCantidades = new ArrayList<Integer>();
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("Tienda_slorenzoPU");
    private EntityManager em = emf.createEntityManager();
    
    
    public void añadirProducto(Producto item, int cantidad){
        System.out.println(cantidad);
        if(getListaProductos().contains(item)){//Si ya tenemos el producto en el carrito sumamos las cantidades
            int posicion = getListaProductos().indexOf(item);
            int suma = (Integer)getListaCantidades().get(posicion) + cantidad;
            getListaCantidades().set(posicion, suma);
        }
        else{
            getListaProductos().add(item);
            getListaCantidades().add(cantidad);
        }
    }
    
    public void eliminarProducto(Producto item, int cantidad){
        if(getListaProductos().contains(item)){//Si ya tenemos el producto en el carrito sumamos las cantidades
            int posicion = getListaProductos().indexOf(item);
            int suma = (Integer)getListaCantidades().get(posicion) - cantidad;
            if(suma>0)
                getListaCantidades().set(posicion, suma);
            else if(suma ==0)
                eliminarProducto(item);    
        }
    }
    
    public void eliminarProducto(Producto item){
        if(getListaProductos().contains(item)){
            int posicion = getListaProductos().indexOf(item);
            getListaProductos().remove(posicion);
            getListaCantidades().remove(posicion);
        }
    }
    
    public int getCantidad(Producto item){
        int cantidad = 0;
        if(getListaProductos().contains(item)){
            int posicion = getListaProductos().indexOf(item);
            cantidad=(Integer) getListaCantidades().get(posicion);
        }
        return cantidad;
    }
    
    
    public void vaciaCarrito(){
        getListaCantidades().clear();
        getListaProductos().clear();
    }
    
    public int numeroProductos(){
        return getListaCantidades().size();
    }
    
    public double totalCarrito(){
        Double total = 0.0;
        
        int numProductos = getListaProductos().size();
        for(int i=0; i<numProductos; i++){
            Producto aux = getListaProductos().get(i);
            int cant = (Integer) getListaCantidades().get(i);
            
            total += aux.getPrecio()*cant;
        }
        return total;
    }
    
    @PostConstruct
    @PostActivate
    private void inicializar(){ }
    
    @Remove public void realizarPedido(){
        ManagedBeanProductos mbp = new ManagedBeanProductos();
        
        Pedido pedido = new Pedido();
        //datos usuario
        Usuario u = new Usuario(); 
        SesionUsuario su = new SesionUsuario();
        u = su.getUsuario();
        //asignar numero de pedido
        Query q;
        q = em.createNamedQuery("Pedido.findAll");
        Collection<Pedido> ped =q.getResultList();
        for(Pedido p : ped){
            pedido.setId(p.getId());
            pedido.setFecha(p.getFecha());
            pedido.setIdusuario(p.getIdusuario());
            pedido.setIdestado(p.getIdestado());
        }
        int numProductos = numeroProductos();
        em.getTransaction().begin();
        Filapedido fp = new Filapedido();
        for(int i=0; i<numProductos; i++){
            Producto aux = getListaProductos().get(i);
            int cant = (Integer) getListaCantidades().get(i);
            fp.setCantidad(cant);
            fp.setIdpedido(pedido);
            fp.setIdproducto(aux); 
            mbp.restarStock(aux, cant);
        }
        em.persist(fp);
        em.getTransaction().commit();
        vaciaCarrito();
    }
    
    @Remove public void cancelar(){ 
        vaciaCarrito();
    }

    public ArrayList<Producto> getListaProductos() {
        return listaProductos;
    }

    public void setListaProductos(ArrayList<Producto> listaProductos) {
        this.listaProductos = listaProductos;
    }

    public ArrayList getListaCantidades() {
        return listaCantidades;
    }

    public void setListaCantidades(ArrayList listaCantidades) {
        this.listaCantidades = listaCantidades;
    }
}
